
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of DetallesVentasInternoData.
	/// </summary>
	public class DetallesVentasInternoData : Singleton<DetallesVentasInternoData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public IList<DetallesVentasInterno> Listar()
		{
			var entidades = new List<DetallesVentasInterno>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAllDetallesVentasInterno");

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetallesVentasInterno
					{
						ventaID = lector.IsDBNull(lector.GetOrdinal("ventaID"))? default(int) : lector.GetInt32(lector.GetOrdinal("ventaID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						cantidad = lector.IsDBNull(lector.GetOrdinal("cantidad"))? default(float) : lector.GetFloat(lector.GetOrdinal("cantidad"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public DetallesVentasInterno Obtener(int ventaID, int loteID, short almacenID)
		{
			var detallesVentasInterno = default(DetallesVentasInterno);
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallesVentasInterno");

			BaseDatos.AddInParameter(comando, "ventaID", DbType.Int32, ventaID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					detallesVentasInterno = new DetallesVentasInterno
					{
						ventaID = lector.IsDBNull(lector.GetOrdinal("ventaID"))? default(int) : lector.GetInt32(lector.GetOrdinal("ventaID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						cantidad = lector.IsDBNull(lector.GetOrdinal("cantidad"))? default(float) : lector.GetFloat(lector.GetOrdinal("cantidad"))
					};
				}
			}
			comando.Dispose();
			return detallesVentasInterno;
		}

		/// <summary>
		/// Saves a record to the DetallesVentasInterno table.
		/// </summary>
		public int Agregar(DetallesVentasInterno detallesVentasInterno, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertDetallesVentasInterno");
			BaseDatos.AddInParameter(comando, "ventaID", DbType.Int32, detallesVentasInterno.ventaID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, detallesVentasInterno.loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, detallesVentasInterno.almacenID);
			BaseDatos.AddInParameter(comando, "cantidad", DbType.Single, detallesVentasInterno.cantidad);

			var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Agregar DetallesVentasInterno.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the DetallesVentasInterno table.
		/// </summary>
		public bool Modificar(DetallesVentasInterno detallesVentasInterno)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateDetallesVentasInterno");
			BaseDatos.AddInParameter(comando, "ventaID", DbType.Int32, detallesVentasInterno.ventaID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, detallesVentasInterno.loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, detallesVentasInterno.almacenID);
			BaseDatos.AddInParameter(comando, "cantidad", DbType.Single, detallesVentasInterno.cantidad);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar DetallesVentasInterno.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetallesVentasInterno table by its primary key.
		/// </summary>
		public bool Eliminar(int ventaID, int loteID, short almacenID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallesVentasInterno");
			BaseDatos.AddInParameter(comando, "ventaID", DbType.Int32, ventaID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallesVentasInterno.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public void EliminarPorAlmacenID(short almacenID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallesVentasInternoByAlmacenID");
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallesVentasInterno.");
			comando.Dispose();
		}

		/// <summary>
		/// Deletes a record from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public void EliminarPorLoteID(int loteID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallesVentasInternoByLoteID");
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallesVentasInterno.");
			comando.Dispose();
		}

		/// <summary>
		/// Deletes a record from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public void EliminarPorVentaID(int ventaID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallesVentasInternoByVentaID");
			BaseDatos.AddInParameter(comando, "ventaID", DbType.Int32, ventaID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallesVentasInterno.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public IList<DetallesVentasInterno> ListarPorAlmacenID(short almacenID)
		{
			var entidades = new List<DetallesVentasInterno>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallesVentasInternoByAlmacenID");

			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetallesVentasInterno
					{
						ventaID = lector.IsDBNull(lector.GetOrdinal("ventaID"))? default(int) : lector.GetInt32(lector.GetOrdinal("ventaID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						cantidad = lector.IsDBNull(lector.GetOrdinal("cantidad"))? default(float) : lector.GetFloat(lector.GetOrdinal("cantidad"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public IList<DetallesVentasInterno> ListarPorLoteID(int loteID)
		{
			var entidades = new List<DetallesVentasInterno>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallesVentasInternoByLoteID");

			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetallesVentasInterno
					{
						ventaID = lector.IsDBNull(lector.GetOrdinal("ventaID"))? default(int) : lector.GetInt32(lector.GetOrdinal("ventaID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						cantidad = lector.IsDBNull(lector.GetOrdinal("cantidad"))? default(float) : lector.GetFloat(lector.GetOrdinal("cantidad"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the DetallesVentasInterno table by a foreign key.
		/// </summary>
		public IList<DetallesVentasInterno> ListarPorVentaID(int ventaID)
		{
			var entidades = new List<DetallesVentasInterno>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallesVentasInternoByVentaID");

			BaseDatos.AddInParameter(comando, "ventaID", DbType.Int32, ventaID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetallesVentasInterno
					{
						ventaID = lector.IsDBNull(lector.GetOrdinal("ventaID"))? default(int) : lector.GetInt32(lector.GetOrdinal("ventaID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						cantidad = lector.IsDBNull(lector.GetOrdinal("cantidad"))? default(double) : lector.GetDouble(lector.GetOrdinal("cantidad"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		#endregion
	}
}
